/*
 * Copyright (c) 2010 All Inclusive Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.googlecode.allinclusive.fw.web.struts.validator;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.FieldChecks;
import org.apache.struts.validator.Resources;

/**
 * validator-rules-custom.xmlで使用した検証クラス
 *
 */
public class CustomFieldChecks extends FieldChecks {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;


    /**
	 * <p>
	 * 指定された日付の逆転チェックを行う
	 * </p>
	 * チェック対象はyyyyMMddの西暦文字列とする
	 * 
	 * @param obj　検査対象のオブジェクト
	 * @param va
	 *            <code>Validator</code>により用意された <code>ValidatorAction</code>
	 * @param field　フィールドオブジェクト
	 * @param errors　ActionMessages アクションエラー
	 * @param validator　Validatorインスタンス
	 * @param request　HTTPリクエスト
	 * @return 入力値が正しければ <code>true</code>
	 */
	public static boolean validateDateOrder(Object obj, ValidatorAction va, Field field, ActionMessages errors,
			Validator validator, HttpServletRequest request) {

		// beanがnullの時、trueを返却する。
		if (obj == null) {
			return true;
		}

		// 検証対象の西暦をStringで取得
		String seirekiBefore = null;
		if (isString(obj)) {
			seirekiBefore = (String) obj;
		} else {
			seirekiBefore = ValidatorUtils.getValueAsString(obj, field.getProperty());
		}

		// 検証値がnullまたは空文字の時、true返却
		if (GenericValidator.isBlankOrNull(seirekiBefore)) {
			return true;
		}

		// 比較対象の日付を取得
		Object form = validator.getParameterValue(Validator.BEAN_PARAM);
		String seirekiAfter = ValidatorUtils.getValueAsString(form, field.getVarValue("afterDate"));

		// 比較対象がnullまたは空文字の時、true返却
		if (GenericValidator.isBlankOrNull(seirekiAfter)) {
			return true;
		}

		try {
			SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
			Date dateBefore = fmt.parse(seirekiBefore);
			Date dateAfter = fmt.parse(seirekiAfter);

			// 検証対象が比較対象より未来日だった場合はエラー
			if (dateBefore.after(dateAfter)) {
				errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field));
				return false;
			}

		} catch (Exception e) {
			// 日付で無かった場合はtrueにする
			// 日付書式は正しい前提
			return true;
		}

		return true;
	}
}
